/*
 * functions.c
 *
 *  Created on: 5 kwi 2014
 *      Author: krzysiek
 */
#include <stdio.h>
#include "wyostrzobraz.h"

char transform_data(int index) {
	char tablica_znakow[10] = {' ', '.', '\'', ':', '~', '*', '=', '&', '%', '#'};

	return tablica_znakow[index];
}
void wczytaj_dane(int data[][MAX_KOL], FILE *input) {
	int x, y;

	for(y=0; y<MAX_WIERSZ; y++)
		for(x=0; x<MAX_KOL; x++)
			fscanf(input, "%d", &data[y][x]);
}
void przetworz_dane(int input[][MAX_KOL], char output[][MAX_KOL+1]) {
	int x, y;

	for(y=0; y<MAX_WIERSZ; y++) {
		for(x=0; x<MAX_KOL; x++)
			output[y][x] = transform_data(input[y][x]);
		output[y][x] = '\0';
	}
}
void popraw_dane(int data[][MAX_KOL]) {
	int x, y;
	float srednia = 0;
	int roznica = 0;
	int wynik = 0;

	for(y=0; y<MAX_WIERSZ; y++) {
		for(x=0; x<MAX_KOL; x++) {
			if(x == 0 && y == 0) {
				// lewy gorny
				wynik = data[y][x] - data[y][x+1];
				if( wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y+1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 2) {
					srednia = (float) (data[y][x+1] + data[y+1][x]) / 2;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(x == MAX_KOL-1 && y == 0) {
				// prawy gorny
				wynik = data[y][x] - data[y][x-1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y+1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 2) {
					srednia = (float) (data[y][x-1] + data[y+1][x]) / 2;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(x == 0 && y == MAX_WIERSZ-1) {
				// lewy dolny
				wynik = data[y][x] - data[y][x+1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y-1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 2) {
					srednia = (float) (data[y][x+1] + data[y-1][x]) / 2.0;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(x == MAX_KOL-1 && y == MAX_WIERSZ-1) {
				// prawy dolny
				wynik = data[y][x] - data[y][x-1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y-1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 2) {
					srednia = (float) (data[y][x-1] + data[y-1][x]) / 2.0;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(y == 0 && (x < MAX_KOL-1 && x > 0)) {
				// gorna krawedz
				wynik = data[y][x] - data[y][x-1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y][x+1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y+1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 3) {
					srednia = (float) (data[y][x-1] + data[y][x+1] + data[y+1][x]) / 3.0;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(y == MAX_WIERSZ-1 && (x < MAX_KOL-1 && x > 0)) {
				// dolna krawedz
				wynik = data[y][x] - data[y][x-1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y][x+1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y-1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 3) {
					srednia = (float) (data[y][x-1] + data[y][x+1] + data[y-1][x]) / 3.0;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(x == 0 && (y < MAX_WIERSZ-1 && y > 0)) {
				// lewa krawedz
				wynik = data[y][x] - data[y][x+1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y-1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y+1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 3) {
					srednia = (float) (data[y][x+1] + data[y+1][x] + data[y-1][x]) / 3.0;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else if(x == MAX_KOL-1 && (y < MAX_WIERSZ-1 && y > 0)) {
				// prawa krawedz
				wynik = data[y][x] - data[y][x-1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y-1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y+1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 3) {
					srednia = (float) (data[y][x-1] + data[y+1][x] + data[y-1][x]) / 3.0;
					if(srednia >= ((int) srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
			else {
				// srodek pola
				wynik = data[y][x] - data[y][x-1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y][x+1];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y+1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				wynik = data[y][x] - data[y-1][x];
				if(wynik > 1 || wynik < -1)
					roznica++;
				if(roznica == 4) {
					srednia = (float) (data[y][x-1] + data[y][x+1] + data[y-1][x] + data[y+1][x]) / 4.0;
					if(srednia >= ((int)srednia + 0.5))
						data[y][x] = (int) srednia + 1;
					else
						data[y][x] = (int) srednia;
				}
				else
					roznica = 0;
			}
		}
		srednia = 0;
		roznica = 0;
	}
}
